今天是第六天我們可以寫一個k8s大型公司備份商業機密資料庫管理系統,以下是程式碼
首先,搭建一個 Kubernetes 集群,可以使用雲平台(如 GKE、EKS 或 AKS)或本地環境(如 Minikube)進行測試。
將資料庫服務打包成容器,並部署在 Kubernetes 中。以下是 PostgreSQL 的範例:
PostgreSQL
部署 (postgres-deployment.yaml
):apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:13
env:
- name: POSTGRES_USER
value: "admin"
- name: POSTGRES_PASSWORD
value: "secretpassword"
- name: POSTGRES_DB
value: "company_secrets"
ports:
- containerPort: 5432
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
volumes:
- name: postgres-data
persistentVolumeClaim:
claimName: postgres-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
使用 Kubernetes 的 CronJob 來定期備份資料庫。每隔一段時間將數據庫導出,並存放在遠程存儲上。
備份 CronJob
:apiVersion: batch/v1
kind: CronJob
metadata:
name: postgres-backup
spec:
schedule: "0 2 * * *" # 每天凌晨 2 點執行
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: postgres:13
env:
- name: POSTGRES_USER
value: "admin"
- name: POSTGRES_PASSWORD
value: "secretpassword"
- name: POSTGRES_DB
value: "company_secrets"
command: ["/bin/sh", "-c"]
args: ["pg_dump -U admin -d company_secrets > /backup/db_backup.sql && gsutil cp /backup/db_backup.sql gs://your-backup-bucket/$(date +%Y-%m-%d)_db_backup.sql"]
volumeMounts:
- name: backup-storage
mountPath: /backup
restartPolicy: OnFailure
volumes:
- name: backup-storage
emptyDir: {}
這個 CronJob
會每天執行資料庫的備份並將備份文件上傳至 Google Cloud Storage。
在備份過程中對數據進行加密,可以使用 gpg
等工具在備份前進行加密處理。
args: ["pg_dump -U admin -d company_secrets | gpg --symmetric --cipher-algo AES256 -o /backup/db_backup.sql.gpg && gsutil cp /backup/db_backup.sql.gpg gs://your-backup-bucket/$(date +%Y-%m-%d)_db_backup.sql.gpg"]
安裝 Prometheus 和 Grafana,並通過 K8s 的 metrics-server
來收集系統狀態和資源使用情況。
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup/
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/
可以設定告警規則來監控備份任務的成功與失敗。
透過 Kubernetes RBAC 控制誰可以操作備份相關的資源。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: backup-role
rules:
- apiGroups: [""]
resources: ["pods", "jobs"]
verbs: ["get", "list", "create", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: backup-rolebinding
namespace: default
subjects:
- kind: User
name: "backup-admin"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: backup-role
apiGroup: rbac.authorization.k8s.io
這樣可以確保只有指定用戶可以執行和管理備份任務。
首先,我們部署了 PostgreSQL 資料庫,並為其持久化存儲配置 PVC (Persistent Volume Claim) 來確保數據不會因為 Pod 重啟或調度到其他節點而丟失。
postgres-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:13
env:
- name: POSTGRES_USER
value: "admin"
- name: POSTGRES_PASSWORD
value: "secretpassword"
- name: POSTGRES_DB
value: "company_secrets"
ports:
- containerPort: 5432
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
volumes:
- name: postgres-data
persistentVolumeClaim:
claimName: postgres-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
apiVersion: apps/v1
和 kind: Deployment
:指定我們在創建一個 Kubernetes Deployment,用來管理資料庫容器的副本。metadata
和 spec
:設定了 Deployment 的名字 (postgres
),並告訴 Kubernetes 應該如何部署這個資料庫。
replicas: 1
:只運行一個副本。containers
部分:指定了容器的設定:
postgres:13
映像作為容器的基礎。POSTGRES_USER
、POSTGRES_PASSWORD
和 POSTGRES_DB
,用來初始化資料庫的用戶名、密碼和資料庫名稱。volumeMounts
:將名為 postgres-data
的 volume 掛載到 /var/lib/postgresql/data
,用來存儲資料庫數據。volumes
部分:將這個 volume 和 PVC (PersistentVolumeClaim
) 綁定,確保數據持久化存儲在物理卷中。PVC 是一個請求存儲的方式,這裡請求了 10GiB 的存儲空間 (storage: 10Gi
)。
我們使用 Kubernetes 的 CronJob
來定時執行備份工作。這個部分定義了每天執行一次資料庫的自動備份,並將備份數據上傳到雲端存儲(如 Google Cloud Storage)。
備份 CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
name: postgres-backup
spec:
schedule: "0 2 * * *" # 每天凌晨 2 點執行
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: postgres:13
env:
- name: POSTGRES_USER
value: "admin"
- name: POSTGRES_PASSWORD
value: "secretpassword"
- name: POSTGRES_DB
value: "company_secrets"
command: ["/bin/sh", "-c"]
args: ["pg_dump -U admin -d company_secrets > /backup/db_backup.sql && gsutil cp /backup/db_backup.sql gs://your-backup-bucket/$(date +%Y-%m-%d)_db_backup.sql"]
volumeMounts:
- name: backup-storage
mountPath: /backup
restartPolicy: OnFailure
volumes:
- name: backup-storage
emptyDir: {}
apiVersion: batch/v1
和 kind: CronJob
:定義了一個 CronJob,它會在指定的時間調度備份任務。schedule: "0 2 * * *"
:定義了備份的執行時間,這裡是每天凌晨 2 點。jobTemplate
:定義了每次備份任務所使用的容器和指令:
containers
部分:使用和資料庫相同的 postgres:13
映像,但這裡的目的是執行資料庫備份操作。
command
和 args
:我們使用 pg_dump
指令來導出資料庫數據到 /backup/db_backup.sql
,然後使用 gsutil
指令將備份文件上傳至 Google Cloud Storage。volumeMounts
:將一個空的臨時卷 (emptyDir
) 掛載到 /backup
,用來存儲暫時的備份文件。備份任務設置為 restartPolicy: OnFailure
,這意味著如果備份任務失敗,會自動重新嘗試。
我們在傳輸數據之前,使用加密工具(如 gpg
)來加密資料庫備份文件,確保數據安全。以下是加密命令的解釋:
args: ["pg_dump -U admin -d company_secrets | gpg --symmetric --cipher-algo AES256 -o /backup/db_backup.sql.gpg && gsutil cp /backup/db_backup.sql.gpg gs://your-backup-bucket/$(date +%Y-%m-%d)_db_backup.sql.gpg"]
pg_dump -U admin -d company_secrets
:這條命令導出資料庫數據。gpg --symmetric --cipher-algo AES256 -o /backup/db_backup.sql.gpg
:這條命令使用對稱加密技術和 AES-256 算法來加密備份數據,並將結果保存為 .gpg
文件。gsutil cp
:上傳加密文件到雲端存儲。你可以使用 Kubernetes 內建的 metrics-server
搭配 Prometheus 和 Grafana 來實現監控和告警功能。監控系統會定期檢查任務執行的狀況,並在備份失敗或其他異常情況下發送告警通知。
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup/
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/
這會安裝 Prometheus,用來監控整個 Kubernetes 集群的狀態。
最後,通過 Kubernetes 的角色基於權限 (RBAC) 控制,確保只有授權用戶可以操作備份系統。
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: backup-role
rules:
- apiGroups: [""]
resources: ["pods", "jobs"]
verbs: ["get", "list", "create", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: backup-rolebinding
namespace: default
subjects:
- kind: User
name: "backup-admin"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: backup-role
apiGroup: rbac.authorization.k8s.io
Role
:定義了可以操作備份相關資源的權限(如 Pods 和 Jobs)。RoleBinding
:將這些權限綁定到特定的用戶 (backup-admin
),使其可以管理備份相關操作。這個 Kubernetes 系統的每個組件協同運作,確保資料庫的備份能夠自動化、安全地執行。通過容器化、定時任務、加密和權限控制,我們構建了一個穩定可靠的備份方案。同時監控和告警功能也為系統的穩定運行提供了保障。